package game.msgame.controller;

import game.msgame.entity.User;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.event.ActionEvent;
import javafx.fxml.Initializable;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.control.TextArea;
import javafx.util.Duration;
import game.msgame.service.DataService;
import game.msgame.service.impl.DataServiceImpl;

import java.net.URL;
import java.util.Objects;
import java.util.ResourceBundle;

/**
 * 私聊界面控制类
 *
 * @author Mr.Alpaca
 * @version 1.0.0
 */
public class PrivateChatController implements Initializable {
    public TextArea chatTextArea;
    public TextArea inputTextArea;
    public Button sendBtn;
    public Button emptyBtn;
    /**
     * 服务类
     */
    private final DataService service = DataServiceImpl.getService();
    /**
     * 发起聊天的对象
     */
    private User sourceUser;
    /**
     * 聊天的对象
     */
    private User targetUser;

    /**
     * 用于从其他控制器传入参数到本控制器
     * 并展示用户信息
     *
     * @param sourceUser 用户
     * @param targetUser 目标用户
     */
    public void passUser(User sourceUser, User targetUser) {
        this.sourceUser = sourceUser;
        this.targetUser = targetUser;
        // 设置文本框
        setupTextArea();
    }

    /**
     * 设置文本框,展示历史消息
     */
    private void setupTextArea() {
        // 获取历史消息
        String historyMessage = service.getHistoryMessage(sourceUser.getId(), targetUser.getId());
        chatTextArea.setText(historyMessage);
    }

    /**
     * 绑定发送按钮事件
     *
     * @param actionEvent 事件
     */
    public void onSendBtn(ActionEvent actionEvent) {
        String text = inputTextArea.getText();
        if (Objects.equals("", text)) {
            Alert alert = new Alert(Alert.AlertType.CONFIRMATION, "发送消息不能为空", ButtonType.FINISH, ButtonType.CLOSE);
            alert.showAndWait();
            return;
        }
        // 处理用户输入
        String message = processMessage(text);
        service.send(message, targetUser);
        inputTextArea.setText("");
    }

    /**
     * 将用户输入处理成规范的信息
     *
     * @param message 用户输入
     * @return 规范化的消息
     */
    private String processMessage(String message) {
        // 若消息不以回车结尾则补加回车
        if (!Objects.equals("\n", message.substring(message.length() - 1))) {
            message += "\n";
        }
        return sourceUser.getId() + "|" + sourceUser.getName() + ": " + message;
    }

    /**
     * 绑定清空按钮事件
     *
     * @param actionEvent 事件
     */
    public void onEmptyBtn(ActionEvent actionEvent) {
        inputTextArea.setText("");
    }

    /**
     * 初始化
     *
     * @param location  资源位置
     * @param resources 资源
     */
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        // 定期刷新聊天记录
        setUpTimeLine();
    }

    /**
     * 设置时间线,定期刷新聊天记录
     */
    private void setUpTimeLine() {
        // 定期刷新聊天双方历史记录
        KeyFrame chatFrame = new KeyFrame(Duration.seconds(1), event -> {
            double v = chatTextArea.getScrollTop();
            chatTextArea.setText(service.getHistoryMessage(sourceUser.getId(), targetUser.getId()));
            chatTextArea.setScrollTop(v);
        });

        // 开启动画
        Timeline timeline = new Timeline();
        timeline.getKeyFrames().add(chatFrame);
        timeline.setCycleCount(Timeline.INDEFINITE);
        timeline.setAutoReverse(true);
        timeline.play();
    }
}
